package com.biblioteca.controlador;

import com.biblioteca.persistencia.Favorito;
import com.biblioteca.persistencia.*;
import com.biblioteca.servicio.*;
import com.biblioteca.view.utils.MessageProvider;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.model.SelectItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.binding.message.MessageBuilder;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.webflow.execution.RequestContext;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;


@Controller("libroControlador")
@Scope("request")
public class libroControlador implements Serializable {

    private LibroServicio libroServicio;
    private UsuarioServicio usuarioServicio;
    private ComentarioServicio comentarioServicio;
    private Libro libroseleccionado;
    private Favorito favoritoseleccionado = new Favorito();
    private FavoritoService favoritoService;
    private GeneroServicio generoServicio;

    private Usuario usuario;
    private SelectItem[] criterios;//lista de items en bajalibro
    private List<Libro> libros;

    String criterioSelecccionado;//criterio a buscar en bajalibro
    String txtabuscar;//texto a buscar en bajalibro
    String cadComentada;
    String isbnFav;

    private List<Genero> generos;
    private String generoSeleccionado;
    private String generoToAdd;
    private String isbn;
    private Comentario comentario;
    private String titulo;




    @Autowired
    @Required
    public void setLibroServicio(LibroServicio libroServicio) {
        this.libroServicio = libroServicio;
    }

    @Autowired
    @Required
    public void setUsuarioServicio(UsuarioServicio usuarioServicio) {
        this.usuarioServicio = usuarioServicio;
    }

    @Autowired
    @Required
    public void setFavoritoService(FavoritoService favoritoService) {
        this.favoritoService = favoritoService;
    }

    @Autowired
    @Required
    public void setGeneroServicio(GeneroServicio generoServicio) {
        this.generoServicio = generoServicio;
    }


    @Autowired
    @Required
    public void setComentarioServicio(ComentarioServicio comentarioServicio) {
        this.comentarioServicio = comentarioServicio;
    }

    @PostConstruct
    public void iniciar() {
       libroseleccionado = new Libro();
        libros = new ArrayList<Libro>();
        generos = new ArrayList<Genero>();
        criterios = new SelectItem[5];
        criterios[0] = new SelectItem("ISBN", "ISBN");
        criterios[1] = new SelectItem("AUTOR", "AUTOR");
        criterios[2] = new SelectItem("EDITORIAL", "EDITORIAL");
        criterios[3] = new SelectItem("TITULO", "TITULO");
        criterios[4] = new SelectItem("GENERO", "GENERO");
        generos = generoServicio.getGenerosAlmacenados();
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }










    public Libro getLibroseleccionado() {
        return libroseleccionado;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public void setLibroseleccionado(Libro libroseleccionado) {
        this.libroseleccionado = libroseleccionado;
    }

    public String getCriterioSelecccionado() {
        return criterioSelecccionado;
    }

    public void setCriterioSelecccionado(String criterioSelecccionado) {
        this.criterioSelecccionado = criterioSelecccionado;
    }

    public String getTxtabuscar() {
        return txtabuscar;
    }

    public void setTxtabuscar(String txtabuscar) {
        this.txtabuscar = txtabuscar;
    }

    public SelectItem[] getCriterios() {
        return criterios;
    }

    public void setCriterios(SelectItem[] criterios) {
        this.criterios = criterios;
    }

    public void setLibros(List<Libro> libros) {
        this.libros = libros;
    }

    public String getCadComentada() {
        return cadComentada;
    }

    public void setCadComentada(String cadComentada) {
        this.cadComentada = cadComentada;
    }

    public String getGeneroSeleccionado() {
        return generoSeleccionado;
    }

    public List<Genero> getGeneros() {
        return generos;
    }

    public void setGeneroSeleccionado(String generoSeleccionado) {
        this.generoSeleccionado = generoSeleccionado;
    }

    public void setGeneros(List<Genero> generos) {
        this.generos = generos;
    }

    public String getGeneroToAdd() {
        return generoToAdd;
    }

    public void setGeneroToAdd(String generoToAdd) {
        this.generoToAdd = generoToAdd;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public Comentario getComentario() {
        return comentario;
    }

    public void setComentario(Comentario comentario) {
        this.comentario = comentario;
    }

        public String getIsbnFav() {
        return isbnFav;
    }

    public void setIsbnFav(String isbnFav) {
        this.isbnFav = isbnFav;
    }

        public Favorito getFavoritoseleccionado() {
        return favoritoseleccionado;
    }
          public void setFavoritoseleccionado(Favorito favoritoseleccionado) {
        this.favoritoseleccionado = favoritoseleccionado;
    }

    public void addGenero(){
        generoServicio.create(generoToAdd);

        FacesContext context = FacesContext.getCurrentInstance();

        context.addMessage(null, new FacesMessage("Correcto" , "Has insertado el genero "+generoToAdd));
    }


     public void crearLibro() {
        libroseleccionado.setGenero(generoSeleccionado);
        libroServicio.create1(libroseleccionado);

        FacesContext context = FacesContext.getCurrentInstance();

        context.addMessage(null, new FacesMessage("Correcto" , "Libro con isbn " + libroseleccionado.getIsbn()+" agregado correctamente"));
        context.addMessage(null, new FacesMessage("Anada otro libro o click en inicio"));
    }

  public String grabarLibro(Libro libro) {
        libro.setGenero(generoSeleccionado);
        libroServicio.create1(libro);
        return "lbro_datos";
    }

    public void borrarLibro(RequestContext context) {
        libroServicio.borrar(libroseleccionado.getIsbn());

        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.addMessage(null, new FacesMessage("Correcto", "Libro Borrado Correctamente"));
    }


     public void borrarComents(){

        Libro lb = libroServicio.buscarIsbn(isbn);

        comentarioServicio.borrar(comentario, lb);
        //libroServicio.update(lb);

        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.addMessage(null, new FacesMessage("Correcto", "Comentario borrado Correctamente"));
    }



   public Collection<Libro> buscarLibros() {
        libros = libroServicio.buscarLibro(criterioSelecccionado, txtabuscar);
        return libros;
    }

   public void ActualizarLibro(Libro actualizar) {
        libroServicio.update(actualizar);

        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.addMessage(null, new FacesMessage("Correcto", "Libro actualizado Correctamente"));
    }
    

     public void ComentarLibro(Libro lib) {
            String usuarioC = usuarioServicio.getCurrentUser().getUsername().toString();
            libroServicio.addComm(lib, cadComentada, usuarioC);
            libroServicio.update(lib);
    }

    public List<Comentario> obtenerComL(Libro comm) {
        List <Comentario> comentarios = comm.getComentarios();
        if (comentarios.isEmpty()){
             comentarios = null;
        }else{
            comentarios = comm.getComentarios();
            System.out.println("obteniendo comemtarios= " + comentarios.get(0).getContenido());
        }
        return comentarios;
    }

        public List<Libro> getLibros() {
        return libroServicio.getALLLibros();
    }

    public void anadirFavoritos(){
            favoritoseleccionado.setUsu(usuarioServicio.getCurrentUser().getUsername().toString());
            favoritoseleccionado.setIsbn(isbnFav);
            favoritoseleccionado.setLibro(titulo);
            favoritoService.anadirFavorito(favoritoseleccionado);
            
            
            FacesContext context = FacesContext.getCurrentInstance();

        context.addMessage(null, new FacesMessage("Correcto" , "Has anadido un libro a tu lista de favoritos "));
        

    }

     public int getNumComentarios(Libro libro){
          int num = libro.getComentarios().size();
          return num;
      }



}
